package p14_cglib的MethodProxy原理;

import org.springframework.cglib.core.Signature;
import p13_cglib代理原理.ProxyClass;

/**
 * 结合代理类的FastClass，流程跟TargetClass差不多
 * 在定义cglib代理类Proxy时，还额外定义了带有原始功能的方法，ProxyFastClass使用的就是这些原始方法
 */
public class _2_ProxyFastClass {
    //下面的Signature是根据代理类Proxy原始方法的扫描结构，动态生成的
    static Signature s0 = new Signature("saveSuper", "()V");
    static Signature s1 = new Signature("saveSuper", "(I)V");
    static Signature s2 = new Signature("saveSuper", "(J)V");

    public int getIndex(Signature s) {
        if (s0.equals(s)) {
            return 0;
        } else if (s1.equals(s)) {
            return 1;
        } else if (s2.equals(s)) {
            return 2;
        }
        return -1;
    }

    /**
     * MethodProxy结合代理类使用，就是间接调用的该方法
     * @param index 代理类中原始方法的下标
     * @param proxy 代理类
     * @param args  原始方法参数
     * @return
     */
    public Object invoke(int index, Object proxy, Object[] args) {
        if(index == 0) {
            ((ProxyClass) proxy).saveSuper();
            return null;
        } else if (index == 1) {
            ((ProxyClass) proxy).saveSuper(((int) args[0]));
            return null;
        } else if (index == 2) {
            ((ProxyClass) proxy).saveSuper(((long) args[0]));
            return null;
        }
        throw new NoSuchMethodError();
    }

    public static void main(String[] args) {
        _2_ProxyFastClass fastClass = new _2_ProxyFastClass();
        int index = fastClass.getIndex(new Signature("saveSuper", "(I)V"));
        //MethodProxy调用invokeSuper方法时，会间接调用fastClass的invoke
        fastClass.invoke(index, new ProxyClass(), new Object[]{1});
    }
}
